#include "macro_define.h"
#include <cassert>
#include <string>
#include <iostream>
#ifdef _WIN32
    #include <windows.h>
#endif // _WIN32

// 一个简单的FOR_EACH_FUN函数
#define FOR_EACH_FUN(i, arg) \
    std::cout << "order number: " << (i) << " arg value: " << (arg) << '\n';

// 对每个参数执行一遍FOR_EACH_FUN函数
#define FOR_EACH_ARG(...) \
    ARG(CONNECT(FOR_EACH_, GET_ARG_COUNT(__VA_ARGS__))(FOR_EACH_FUN, 0, __VA_ARGS__))

int main()
{
#ifdef _WIN32
    SetConsoleCP(65001);
    SetConsoleOutputCP(65001);
#endif // _WIN32
    const std::string s1(STRING(STRING(STRING(a, b), c), d, e, STRING(f, g)));
    assert(s1 == "\"\\\"a, b\\\", c\", d, e, \"f, g\"");
    const std::string s2(STRING(a, b, c, d, e, f));
    assert(s2 == "a, b, c, d, e, f");

    const int num0 = VA_ARGS_NUM(unused, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50,
                                 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33,
                                 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16,
                                 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0);
    assert(num0 == 0);

    // 最大64个参数
    const int num1 = VA_ARGS_NUM(
        unused, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18,
        _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36,
        _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54,
        _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55,
        54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32,
        31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9,
        8, 7, 6, 5, 4, 3, 2, 1, 0);
    assert(num1 == 64);

    const int num2 = GET_ARG_COUNT();
    assert(num2 == 0);

    // 不能超过64个参数
    const int num3 = GET_ARG_COUNT(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15,
                                   _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28,
                                   _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41,
                                   _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54,
                                   _55, _56, _57, _58, _59, _60, _61, _62, _63, _64);
    assert(num3 == 64);

    FOR_EACH_ARG();
    FOR_EACH_ARG("abc", 1, "defg", 1.23);
    // 最大64个参数
    FOR_EACH_ARG(63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43,
                 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22,
                 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0);

    const TYPEOF((int)v) x1 = 10;
    const int STRIP((int)x2) = 10;
    const PAIR((int)x3) = 10;

    return 0;
}